快速上手Pandas数据结构合并
今日份知识你摄入了么?
在本教程中,我们将通过示例来了解合并Pandas DataFrames的不同方法。
#
介绍
在许多现实生活场景中,为了便于管理,我们将数据存储在不同的文件中,经常需要将它们合并成一个更大的DataFrame进行分析。Pandas为我们提供了各种方法来合并DataFrame,如concat和merge。此外,它还提供了用于比较的实用程序。
我们将通过示例来了解这两种方法的工作原理。对于本教程,我们将假设你具备Python和Pandas的基本知识。
#
连接DataFrame
如果两个DataFrame格式相同,我们选择.concat()方法。它将一个DataFrame中的列或行附加到另一个DataFrame。.concat ()沿轴执行连接操作。在深入讨论其细节之前,我们快速了解一下语法及其参数。
pd.concat(objs,axis=0,join="outer",ignore_index=False,keys=None,
levels=None,names=None,verify_integrity=False,copy=True,)
这里只关注主要参数:
objs :要连接的DataFrame对象或Series的列表。
axis :axis = 0 意味着pandas将第二个DataFrame堆叠在第一个DataFrame下方(按行连接),而axis =1意味着pandas将第二个DataFrame堆叠到第一个 DataFrame的右侧(按列连接)。默认情况下,axis = 0。
join:默认join=outer,outer用于union,inner用于intersection。
ignore_index:它会在连接过程中忽略索引,默认情况下,它为False。但如果索引没有意义,则忽略它们是有用的。
verify_integrity:它检查新连接轴中的重复项,但默认情况下,它为False。
示例:
import pandas as pd
# First Dict with two 2 and 4 columns
data_one = {'A' : ['A1','A2','A3','A4'] , 'B' : ['B1','B2','B3','B4']}
# Second Dict with two 2 and 4 columns
data_two = {'C' : ['C1','C2','C3','C4'] , 'D' : ['D1','D2','D3', 'D4']}
# Converting to DataFrames
df_one=pd.DataFrame(data_one)
df_two=pd.DataFrame(data_two)
#
场景 1:按列连接
假设A、B、C和D列代表不同的功能,但索引相同,则将C和D行连接到df_one 右侧更有意义。
# Joining the columns
new_df = pd.concat([df_one,df_two],axis=1)
#
场景 2:按行连接
如果我们继续上述假设并按行将它们连接起来,那么生成的DataFrame将包含大量NaN值缺失数据。原因很简单,假设df_two中index = 0我们不能将它直接放在A列和B列下面,因为我们认为它们是值不存在的不同的函数。因此,pandas 将自动为A、B、C和D创建一个完整的行,它们各自的列中缺少值。
# Joining the rows
new_df1 = pd.concat([df_one,df_two],axis=0)
请注意,我们的最终结果中有重复索引。因为默认情况下,ignore_index = False,它将DataFrame的索引保存为原始状态。这在我们的例子中可能没有用,所以我们将设置ignore_index = True。
# Joining the rows
new_df2 = pd.concat([df_one,df_two],axis=0 , ignore_index= True)
如果两个DataFrame中的列表示相同的东西,只是命名不同,那么我们可以在连接之前重命名这些列。
# Joining the rows
df_two.columns = df_one.columns
new_df3 = pd.concat([df_one,df_two],axis=0 , ignore_index= True)
#
Merging Dataframes
Merge或Join Dataframes不同于Concat。Concat连接意味着只是沿着所需的轴将一个Dataframe堆叠在另一个Dataframe上。而Join的工作原理与SQL中的连接类似。我们可以根据唯一列组合Dataframe,这些方法性能明显更好。当一个 DataFrame是“查找表”时,它非常有用,其中包含我们想要连接到另一个的附加数据。我们来看看它的语法和参数:
pd.merge( left, right, how="inner", on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True, suffixes=("_x", "_y"),
copy=True, indicator=False, validate=None)
让我们看一下它的主要参数以及它们的用途:
left:Dataframe对象
right:Dataframe对象
how:连接类型,即inner、outer、left、right等。默认how = “inner”
on:DataFrame中共有的列,构成连接操作的基础。
left_on:如果使用right_index作为要加入的列,则必须指定将用作键的列。
right_on:left_on反之亦然
left_index:如果设置为True,则使用左DataFrame的行标签(索引)作为连接键
right_index:left_index 的反之亦然
sort:通过连接键按顺序对生成的DataFrame进行排序,但不建议这样做,因为它会严重影响性能。
suffixes:如果我们有一个重叠的列,你可以分配后缀来区分它们。默认情况下,它设置为 ('_x', '_y')。
示例:
sports和library DataFrame的例子,假设两个DataFrame中的“name”列是唯一的,可以用作主键。
import pandas as pd
# First DataFrame
sports= pd.DataFrame({'sports_id':[1,2,3,4],'name':['Alex','David','James','Sara']})
# Second DataFrame
library= pd.DataFrame({'library_id':[1,2,3,4],'name':['David','James','Peter','Harry']})
#
场景一:Inner内连接和Outer外连接
对于它们两者,在. merge()方法中dataFrame的位置无关紧要,因为最终结果是相同的。如果我们将两个DataFrame视为两个集合,则内连接将引用它们的交集,而外连接将引用它们的并集。
inner_join = pd.merge(sports,library,how="inner",on="name")
outer_join = pd.merge(library,sports,how="outer",on="name")
#
场景二:左右连接
在这里,我们放置DataFrame的顺序很重要。例如,在左连接中,放置在左侧位置的DataFrame对象的所有数据将与来自右侧DataFrame对象的匹配数据一起显示。右连接与左连接的作用正好相反。从一个例子中理解这个概念。
left_join = pd.merge(sports,library,how="left",on="name")
right_join= pd.merge(library,sports,how="right",on="name")
#
场景三:使用索引连接
首先,使用set_index()方法修改sports表,使“name”列成为索引。
sports = sports.set_index("name")
如果现在我们将sports作为我们的左DataFrame,应用inner操作并设置left_index= True。
index_join = pd.merge(sports,library,how="inner",left_index = True, right_on="name")
请注意,它显示的结果与我们之前内连接的结果相同。
#
场景四:后缀属性
通过将sports_id和login_id更改为id对原始DataFrame进行修改。现在虽然名称相同,但我们指的是不同的id。Pandas可以识别它并添加后缀。稍后将看到如何自定义这些后缀。
# First DataFrame
sports= pd.DataFrame({'id':[1,2,3,4],'name':['Alex','David','James','Sara']})
# Second DataFrame
library= pd.DataFrame({'id':[1,2,3,4],'name':['David','James','Peter','Harry']})
inner_join = pd.merge(sports,library,how="inner",on="name")
这里id_x指的是左边的DataFrame,而id_y 指的是右边的DataFrame。虽然,它完成了它的工作,但为了代码更清晰,可读性更高,我们使用suffixes属性自定义这些后缀。
suffix_ = pd.merge(sports,library,how="inner",on="name", suffixes=('_sport','_lib'))
#
结论
本文旨在简化Pandas中合并行的概念。当你从.csv文件中提取大规模数据时,建议你开始执行连接操作之前分析一下数据的类型和格式。Pandas在这方面也有一些很好的方法。如有任何问题,请参阅Pandas的官方文档。最后强调,一切都需要实践,你可以自行尝试不同的DataFrame,以便更好地理解。
Kanwal Mehreen是一位有抱负的软件开发人员,她相信持续的努力和承诺。她是一位志向远大的程序员,对数据科学和机器学习领域有着浓厚的兴趣。
原文作者:Kanwal Mehreen
翻译作者:明慧
美工编辑:过儿
校对审稿:Miya
原文链接:https://www.kdnuggets.com/2022/09/combining-pandas-dataframes-made-simple.html
本周公开课预告
往期精彩回顾
点击“阅读原文”查看数据应用学院核心课程